//
//  Location.m
//  RRQS
//
//  Created by kyjun on 16/3/24.
//
//

#import "Location.h"

@interface Location()<CLLocationManagerDelegate>



@end

const double pi = 3.1415926535897932384626;
const double a = 6378245.0;
const double ee = 0.00669342162296594323;

@implementation Location

+(instancetype)sharedManager{
    static dispatch_once_t onceToken;
    static Location* shareLocation;
    dispatch_once(&onceToken, ^{
        shareLocation = [[self alloc] init];
    });
    return shareLocation;
}

- (instancetype)init
{
    self = [super init];
    if ( self )
    {
        if ([CLLocationManager locationServicesEnabled]) {
            self.locationManager = [[CLLocationManager alloc] init];
            _locationManager.delegate = self;
            _locationManager.desiredAccuracy = kCLLocationAccuracyBest; //控制定位精度,越高耗电量越大。
            _locationManager.distanceFilter = 100; //控制定位服务更新频率。单位是“米”
            [_locationManager startUpdatingLocation];
            
            
            //在ios 8.0下要授权
            if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
            {
//                [_locationManager requestWhenInUseAuthorization];  //调用了这句,就会弹出允许框了.
                /** 后台也可以定位 */
                [self.locationManager requestAlwaysAuthorization];
            }
            if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0){
                [_locationManager setAllowsBackgroundLocationUpdates:NO];  //调用了这句,就会弹出允许框了.
            }
            
        }else{
            MLocation* empty =[MSingle shareAuhtorization].locationInfo;
            if(!empty)
                empty =[[MLocation alloc]init];
            empty.enabled = NO;
            empty.lat = @"";
            empty.lng = @"";
            Boolean flag= [NSKeyedArchiver archiveRootObject:empty toFile:[WMHelper archiverLocationCirclePath]];
            if(flag){
                NSLog(@"%@",@"坐标归档成功!");
            }else{
                NSLog(@"%@",@"坐标归档失败!");
            }
        }
    }
    return self;
}

-(void)uploadLocation:(CLLocation*)location{
    
    MLocation* empty =[MSingle shareAuhtorization].locationInfo;
    if(!empty)
        empty =[[MLocation alloc]init];
    empty.enabled = YES;
    empty.lat = [NSString stringWithFormat:@"%f",location.coordinate.latitude];
    empty.lng = [NSString stringWithFormat:@"%f",location.coordinate.longitude];
    Boolean flag= [NSKeyedArchiver archiveRootObject:empty toFile:[WMHelper archiverLocationCirclePath]];
    if(flag){
        NSLog(@"%@",@"坐标归档成功!");
        // [[NSNotificationCenter defaultCenter ] postNotificationName:NotificationTestLocation object:nil];
    }else{
        NSLog(@"%@",@"坐标归档失败!");
    }
    if([MSingle shareAuhtorization].userInfo.isLogin){
        AFHTTPSessionManager *mgr=[AFHTTPSessionManager manager];
        NSDictionary* arg = @{@"ince":@"set_emp_location",@"emp_id":[MSingle shareAuhtorization].userInfo.userID,@"lat":empty.lat,@"lng":empty.lng};
        [mgr POST:kHost parameters:arg progress:nil success:^(NSURLSessionDataTask * _Nonnull operation, id  _Nonnull responseObject) {
            [WMHelper outPutJsonString:responseObject];
            NSInteger flag = [[responseObject objectForKey:@"status"]integerValue];
            if(flag == 1){
                NSLog(@"上传坐标%@",[responseObject objectForKey:@"sucess"]);
            }else{
                NSLog(@"上传坐标%@",[responseObject objectForKey:@"fail"]);
            }
            
        } failure:^(NSURLSessionDataTask *_Nonnull operation, NSError * _Nonnull error) {
            NSLog(@"%@",error.description);
        }];
    }
}

#pragma mark =====================================================  <CLLocationManagerDelegate>
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
    
    CLLocationCoordinate2D empty = [Location transformFromWGSToGCJ:newLocation.coordinate];
    CLLocation* emptyLocation = [[CLLocation alloc]initWithLatitude:empty.latitude longitude:empty.longitude];
    [self uploadLocation:emptyLocation];
    NSLog(@"la---%f, lo---%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude);
}
/**
 *定位失败，回调此方法
 */
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    if ([error code]==kCLErrorDenied) {
        NSLog(@"访问被拒绝");
    }
    if ([error code]==kCLErrorLocationUnknown) {
        NSLog(@"无法获取位置信息");
    }
}

#pragma mark -  定位代理方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
    
    CLLocation *loc = [locations objectAtIndex:0];
    CLLocationCoordinate2D empty = [Location transformFromWGSToGCJ:loc.coordinate];

    CLLocation* emptyLocation = [[CLLocation alloc]initWithLatitude:empty.latitude longitude:empty.longitude];
    [self uploadLocation:emptyLocation];
    
    NSLog(@"经纬度  %f  %f ",loc.coordinate.latitude,loc.coordinate.longitude);
    NSLog(@"转化完的经纬度  %f  %f ",emptyLocation.coordinate.latitude,emptyLocation.coordinate.longitude);

//    [self uploadLocation:loc];

    
}






//WGS-84 到 GCJ-02 的转换
+(CLLocationCoordinate2D)transformFromWGSToGCJ:(CLLocationCoordinate2D)wgsLoc
{
    CLLocationCoordinate2D adjustLoc;
    if([self isLocationOutOfChina:wgsLoc]){
        adjustLoc = wgsLoc;
    }else{
        double adjustLat = [self transformLatWithX:wgsLoc.longitude - 105.0 withY:wgsLoc.latitude - 35.0];
        double adjustLon = [self transformLonWithX:wgsLoc.longitude - 105.0 withY:wgsLoc.latitude - 35.0];
        double radLat = wgsLoc.latitude / 180.0 * pi;
        double magic = sin(radLat);
        magic = 1 - ee * magic * magic;
        double sqrtMagic = sqrt(magic);
        adjustLat = (adjustLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
        adjustLon = (adjustLon * 180.0) / (a / sqrtMagic * cos(radLat) * pi);
        adjustLoc.latitude = wgsLoc.latitude + adjustLat;
        adjustLoc.longitude = wgsLoc.longitude + adjustLon;
    }
    return adjustLoc;
}


//判断是不是在中国
+(BOOL)isLocationOutOfChina:(CLLocationCoordinate2D)location
{
    if (location.longitude < 72.004 || location.longitude > 137.8347 || location.latitude < 0.8293 || location.latitude > 55.8271)
        return YES;
    return NO;
}

+(double)transformLatWithX:(double)x withY:(double)y
{
    double lat = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(abs(x));
    lat += (20.0 * sin(6.0 * x * pi) + 20.0 *sin(2.0 * x * pi)) * 2.0 / 3.0;
    lat += (20.0 * sin(y * pi) + 40.0 * sin(y / 3.0 * pi)) * 2.0 / 3.0;
    lat += (160.0 * sin(y / 12.0 * pi) + 320 * sin(y * pi / 30.0)) * 2.0 / 3.0;
    return lat;
}

+(double)transformLonWithX:(double)x withY:(double)y
{
    double lon = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(abs(x));
    lon += (20.0 * sin(6.0 * x * pi) + 20.0 * sin(2.0 * x * pi)) * 2.0 / 3.0;
    lon += (20.0 * sin(x * pi) + 40.0 * sin(x / 3.0 * pi)) * 2.0 / 3.0;
    lon += (150.0 * sin(x / 12.0 * pi) + 300.0 * sin(x / 30.0 * pi)) * 2.0 / 3.0;
    return lon;
}



@end
